
package com.hazelcast.client.impl.clientside;

import com.hazelcast.client.impl.protocol.codec.DynamicConfigAddUserCodeNamespaceConfigCodec;
import com.hazelcast.client.impl.protocol.task.dynamicconfig.ResourceDefinitionHolder;
import com.hazelcast.config.ConfigAccessor;
import com.hazelcast.config.UserCodeNamespaceConfig;
import com.hazelcast.config.UserCodeNamespacesConfig;
import com.hazelcast.spi.annotation.PrivateApi;

import java.util.List;
import java.util.stream.Collectors;

public class ClientDynamicClusterUserCodeNamespacesConfig extends UserCodeNamespacesConfig {
    private ClientDynamicClusterConfig parent;

    public ClientDynamicClusterUserCodeNamespacesConfig(ClientDynamicClusterConfig parent) {
        this.parent = parent;
    }

    private static List<ResourceDefinitionHolder> toResourceDefinitionHolders(UserCodeNamespaceConfig userCodeNamespaceConfig) {
        return ConfigAccessor.getResourceDefinitions(userCodeNamespaceConfig).stream().map(ResourceDefinitionHolder::new).collect(Collectors.toList());
    }

    @Override
    public boolean isEnabled() {
        throw new UnsupportedOperationException(ClientDynamicClusterConfig.UNSUPPORTED_ERROR_MESSAGE);
    }

    @Override
    public UserCodeNamespacesConfig setEnabled(boolean enabled) {
        throw new UnsupportedOperationException(ClientDynamicClusterConfig.UNSUPPORTED_ERROR_MESSAGE);
    }

    @Override
    public UserCodeNamespacesConfig addNamespaceConfig(UserCodeNamespaceConfig userCodeNamespaceConfig) {
        parent.invoke(DynamicConfigAddUserCodeNamespaceConfigCodec.encodeRequest(userCodeNamespaceConfig.getName(), toResourceDefinitionHolders(userCodeNamespaceConfig)));
        return this;
    }

    // Exists to provide (Cloud) Operators a method of registering Namespace resources available from a URL to all members
    @PrivateApi
    public UserCodeNamespacesConfig addMemberRelativeNamespaceConfig(String namespaceName, List<ResourceDefinitionHolder> resourceDefinitionHolders) {
        parent.invoke(DynamicConfigAddUserCodeNamespaceConfigCodec.encodeRequest(namespaceName, resourceDefinitionHolders));
        return this;
    }

    @Override
    public UserCodeNamespacesConfig removeNamespaceConfig(String namespace) {
        throw new UnsupportedOperationException(ClientDynamicClusterConfig.UNSUPPORTED_ERROR_MESSAGE);
    }
}
